// 装饰器执行顺序

function classDecorator1(target) {
  console.log('类装饰器1')
}
function classDecorator2(target) {
  console.log('类装饰器2')
}

function methodDecorator1(target, propertyKey, descriptor) {
  console.log('方法装饰器1')
}
function methodDecorator2(target, propertyKey, descriptor) {
  console.log('方法装饰器2')
}
function propertyDecorator1(target, propertyKey) {
  console.log('属性装饰器1')
}
function propertyDecorator2(target, propertyKey) {
  console.log('属性装饰器2')
}

function accessorDecorator1(target, propertyKey, descriptor) {
  console.log('访问器装饰器1')
}
function accessorDecorator2(target, propertyKey, descriptor) {
  console.log('访问器装饰器2')
}

function parametorDecorator1(target, propertyKey, index) {
  console.log('参数装饰器1', propertyKey)
}
function parametorDecorator2(target, propertyKey, index) {
  console.log('参数装饰器2', propertyKey)
}
function parametorDecorator3(target, propertyKey, index) {
  console.log('参数装饰器3', propertyKey)
}

@classDecorator2
@classDecorator1
class Example {


  @methodDecorator2
  @methodDecorator1
  method(@parametorDecorator3 a, @parametorDecorator2 @parametorDecorator1 b) {}

  @accessorDecorator2
  @accessorDecorator1
  get myProp() {
    return this.prop
  }
  @propertyDecorator2
  @propertyDecorator1
  prop: string
}
